<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /**
     * 实现 Array.prototype.flat 方法
     *
     * @param {number} depth - 指定要扁平化的深度，默认值为 1。
     * @returns {Array} - 返回一个新的扁平化后的数组。
     */
    Array.prototype.myFlat = function (depth = 1) {
      // 检查调用者是否为数组
      if (!Array.isArray(this)) {
        throw new Error('myFlat must be used by Array!');
      }

      // 检查 depth 是否为数字
      if (typeof depth !== "number") {
        throw new TypeError('Depth must be a number');
      }

      // 如果 depth 为 0，直接返回原数组的浅拷贝
      if (depth === 0) {
        return this.slice();
      }

      // 初始化结果数组
      let result = [];

      // 遍历数组中的每个元素
      for (let item of this) {
        // 如果当前元素是数组且深度大于 0，则递归调用 myFlat
        if (Array.isArray(item) && depth > 0) {
          // 递归调用 myFlat，深度减 1
          result = result.concat(item.myFlat(depth - 1));
        } else {
          // 如果当前元素不是数组，直接添加到结果数组中
          result.push(item);
        }
      }

      return result;
    };

    // 测试代码
    const arr = [1, 2, [3, 4, [5, 6, [7, 8]]]];
    console.log('arr.myFlat(1):', arr.myFlat(1)); // [1, 2, 3, 4, [5, 6, [7, 8]]]
    console.log('arr.flat(1)', arr.flat(1))
    console.log('arr.myFlat(2):', arr.myFlat(2)); // [1, 2, 3, 4, 5, 6, [7, 8]]
    console.log('arr.flat(2):', arr.flat(2))
    console.log('arr.myFlat(Infinity):', arr.myFlat(Infinity)); // [1, 2, 3, 4, 5, 6, 7, 8]
    console.log('arr.flat(Infinity):', arr.flat(Infinity)); // [1, 2, 3, 4, 5, 6, 7, 8]
  </script>
</body>
</html>
